Micron Document
<!DOCTYPE html>
<html class="client-nojs vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-0 vector-toc-not-available vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-0 skin-theme-clientpref-day vector-sticky-header-enabled" lang="de" dir="ltr"><head>
<meta charset="UTF-8">
<title>Kreis-Ellipse-Problem</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/png" href="./_res_/favicon.png">
<link rel="canonical" href="https://de.wikipedia.org/wiki/Kreis-Ellipse-Problem"> <link href="./_mw_/ext.cite.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.wikimediamessages.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.icons.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.search.codex.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.styles.css" rel="stylesheet" type="text/css">
<meta name="ResourceLoaderDynamicStyles" content="">
<link href="./_mw_/ext.gadget.citeRef.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.defaultPlainlinks.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonHide.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonLayout.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonStyle.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiDarkmode.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiResponsive.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.specialSearch.css" rel="stylesheet" type="text/css">
<link rel="stylesheet" type="text/css" href="./_mw_/site.styles.css">
<link rel="stylesheet" type="text/css" href="./_mw_/noscript.css">
<link rel="stylesheet" type="text/css" href="./_res_/footer.css">
<link rel="stylesheet" type="text/css" href="./_res_/vector-2022.css">
</head>
<body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-Kreis-Ellipse-Problem rootpage-Kreis-Ellipse-Problem skin-vector-2022 action-view">
<div class="mw-page-container">
<div class="mw-page-container-inner">
<div class="mw-content-container">
<main id="content" class="mw-body">
<header class="mw-body-header vector-page-titlebar">
<h1 id="firstHeading" class="firstHeading mw-first-heading"><span class="mw-page-title-main">Kreis-Ellipse-Problem</span></h1>
</header>
<a id="top"></a>
<div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" data-mw-ve-target-container="">
<div id="contentSub">
<div id="mw-content-subtitle"></div>
</div>
<div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="de" dir="ltr"><div class="mw-content-ltr mw-parser-output" lang="de" dir="ltr"><p>Das <b>Kreis-Ellipse-Problem</b> ist ein prominentes, wiederholt diskutiertes Problem aus dem Bereich der <a href="Objektorientierte_Programmierung" title="Objektorientierte Programmierung">objektorientierten Programmierung</a> im Zusammenhang mit der <a href="Objektmodell" title="Objektmodell">Modellierung</a> von <a href="Vererbung_(Programmierung)" title="Vererbung (Programmierung)">Vererbungsbeziehungen</a>. Einerseits <i>ist ein</i> <a href="Kreis" title="Kreis">Kreis</a> eindeutig eine <a href="Ellipse" title="Ellipse">Ellipse</a>, was dafür spricht, dass es sich um einen <a href="Subtyp" title="Subtyp">Subtyp</a> der Ellipse handelt. Andererseits führt die Unterstützung einer nachträglichen, unabhängigen Veränderung der Länge der beiden <a href="Gro%C3%9Fe_Halbachse" class="mw-redirect" title="Große Halbachse">Halbachsen</a>, die für eine Ellipse sinnvoll sein kann, bei einem Kreis zu einem Problem, das häufig im Zusammenhang mit dem <a href="Liskovsches_Substitutionsprinzip" title="Liskovsches Substitutionsprinzip">Liskovschen Substitutionsprinzip</a> diskutiert wird.
</p><p>Ein analoger Fall ist die Beziehung zwischen <a href="Quadrat" title="Quadrat">Quadrat</a> und <a href="Rechteck" title="Rechteck">Rechteck</a>.
</p>

<div class="mw-heading mw-heading2"><h2 id="Beispiel">Beispiel</h2></div>
<p>In einer typischen Klassenhierarchie zur Implementierung einer <a href="Grafiksoftware" title="Grafiksoftware">Grafiksoftware</a> könnte von einer <a href="Basisklasse" title="Basisklasse">Basisklasse</a> <code>GrafischesElement</code> –&nbsp;neben anderen Unterklassen&nbsp;– die Klasse <code>Ellipse</code> abgeleitet werden und von dieser wiederum die Klasse <code>Kreis</code>. Bereits in der Basisklasse gibt es eine <a href="Methode_(Programmierung)" title="Methode (Programmierung)">Methode</a> <code>Zeichne</code>, die das jeweilige Grafikelement auf den Bildschirm darstellt. Nun ist durchaus denkbar, dass die Methoden <code>SkaliereX</code> und <code>SkaliereY</code> in der Klasse <code>Ellipse</code> eingeführt werden, um dem Benutzer die nachträgliche Anpassung der Halbachsen zu ermöglichen. <code>Kreis</code> als Spezialisierung der Ellipse erbt diese Methoden. Allerdings ist ein Kreis nach Anpassung nur einer der beiden Halbachsen kein Kreis mehr. Ein möglicher Ausweg aus diesem Dilemma wäre, bei einem Kreis bei Anpassung einer der Halbachsen die andere automatisch anzugleichen. Allerdings wäre dies ein Verstoß gegen das <a href="Liskovsches_Substitutionsprinzip" title="Liskovsches Substitutionsprinzip">liskovsche Substitutionsprinzip</a>, da ein Objekt der Klasse <code>Kreis</code> sich nicht mehr verhält, wie man es für eine <code>Ellipse</code> erwarten würde.
</p>
<div class="mw-heading mw-heading2"><h2 id="Lösungsvorschläge"><span id="L.C3.B6sungsvorschl.C3.A4ge"></span>Lösungsvorschläge</h2></div>
<p>Hauptsächlich werden folgende Lösungsmöglichkeiten dieses Problems diskutiert:
</p>
<ul><li><i>Fehlschlagspezifikation für die Größenanpassung</i>: Bereits auf Ebene der Ellipse wird vorgesehen, dass beim Methodenaufruf zur Änderung der Größe ein Scheitern der Operation möglich ist, was beispielsweise mittels eines Rückgabewerts kenntlich gemacht wird. Das Problem dieser und ähnlicher Abhilfemaßnahmen ist vor allem, dass eine solche Vorkehrung bereits auf Ebene der Basisklasse eingeführt werden muss, wo sie eigentlich unnötig ist. Verallgemeinert gesehen erfordert diese Lösungsvariante, dass die Entwickler der Basisklasse diesen Fall vorausahnen müssen, obwohl sie den konkreten Problemfall möglicherweise gar nicht kennen, da typischerweise Entwickler einer Basisklasse weder alle Anwendungsfälle ihrer Klasse kennen, noch mit den Entwicklern der spezialisierenden Klassen in Kontakt stehen.</li></ul>
<ul><li><i>Vertauschen der Vererbungsrichtung</i>: Diese Variante wurde in einer frühen, von <a href="Adele_Goldberg" title="Adele Goldberg">Adele Goldberg</a> entwickelten, <a href="Klassenbibliothek" class="mw-redirect" title="Klassenbibliothek">Klassenbibliothek</a> vom Prinzip her umgesetzt, und zwar war dort ein Rechteck als Spezialisierung eines Quadrats implementiert. Die Argumentation war, dass ein Rechteck zu einem Quadrat eine neue Eigenschaft ergänzt und zwar die Länge der anderen Seite. Kritisiert wird an dieser Implementierung, dass die Aussage „ein Rechteck ist ein Quadrat“ mathematisch widersinnig sei.<sup id="cite_ref-Meyer1996_1-0" class="reference"><a href="#cite_note-Meyer1996-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup></li></ul>
<ul><li><i>Verzicht auf eine Spezialisierung</i> für <code>Kreis</code>: Stattdessen kann in <code>Ellipse</code> eine zusätzliche Methode <code>IstKreis</code> vorgesehen werden. Der Nachteil dieser Variante ist, dass die Eigenschaften eines Kreises, die spezifisch für diesen sind und für eine Ellipse nicht gelten (beispielsweise der Radius), nicht in der <a href="Schnittstelle_(Objektorientierung)" title="Schnittstelle (Objektorientierung)">Schnittstelle</a> der Klasse untergebracht werden können. Der Vorteil ist, dass Ellipsen, die über eine nachträgliche Skalierung zu Kreisen werden, gleichberechtigt zu Kreisen sind, die seit Konstruktion solche sind.</li></ul>
<ul><li><i>Verzicht auf eine Vererbungsbeziehung</i>: Keine der beiden Klassen erbt von der anderen, sondern beide erben gleichberechtigt von einer gemeinsamen Basisklasse. Wenn als gemeinsame Basisklasse eine allgemeine Klasse <code>GrafischesElement</code> verwendet wird, hat das den Nachteil, dass gemeinsame Funktionalität von <code>Kreis</code> und <code>Ellipse</code> doppelt implementiert werden muss, das heißt, <a href="Redundanz_(Informationstheorie)" title="Redundanz (Informationstheorie)">redundant</a> ist. Um diese Redundanz zu vermindern, könnte ein <a href="Mixin" title="Mixin">Mixin</a> verwendet werden, falls die Sprache so etwas unterstützt.</li></ul>
<div class="mw-heading mw-heading2"><h2 id="Bewertung">Bewertung</h2></div>
<p>Es lässt sich nicht unabhängig vom konkreten Anwendungsfall festlegen, ob <code>Kreis</code> sich als Spezialisierung von <code>Ellipse</code> eignet oder nicht. Im Wesentlichen hängt es davon ab, ob eine Ellipse nach <a href="Objekt_(Programmierung)#Instanziierung" title="Objekt (Programmierung)">Instanziierung</a> in der Größe anpassbar sein soll oder nicht.
</p>
<div class="mw-heading mw-heading2"><h2 id="Literatur">Literatur</h2></div>
<ul><li>Charles F. Bowman: <i>Wisdom of the gurus: a vision for object technology</i>. Cambridge University Press, 1996, ISBN 0-13-499849-9</li></ul>
<div class="mw-heading mw-heading2"><h2 id="Einzelnachweise">Einzelnachweise</h2></div>
<ol class="references">
<li id="cite_note-Meyer1996-1"><span class="mw-cite-backlink"><a href="#cite_ref-Meyer1996_1-0">↑</a></span> <span class="reference-text">B. Meyer: <i>The many faces of inheritance: A taxonomy of taxonomy</i>. In: IEEE Computer, Vol. 29, Seite 105–108, 1996.</span>
</li>
</ol></div><!--htdig_noindex--><div><div class="zim-footer">
Dieser Artikel wurde von <a class="external text" title="Zuletzt bearbeitet am 2025-10-01" href="https://de.wikipedia.org/wiki/?title=Kreis-Ellipse-Problem&amp;oldid=260215784">Wikipedia</a> herausgegeben. Der Text ist unter <a class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.de">Creative Commons Attribution-Share Alike 4.0</a> verfügbar, sofern nicht anders angegeben. Für die Mediendateien können zusätzliche Bedingungen gelten.
</div>
</div><!--/htdig_noindex--></div>
</div>
</main>
</div>
</div>
</div>
<script src="./_webp_/webpHandler.js"></script>

</body></html>